<?php

class Shell {

	/**
	 * 递归创建目录
	 * @param $dir
	 * @param $mode
	 * @return bool
	 */
	public static function mkDir($dir, $mode = 0777): bool {
		if (!is_dir($dir)) {
			self::mkDir(dirname($dir), $mode);
			@mkdir($dir, $mode);
		}
		return true;
	}

	/**
	 * 递归清理目录
	 * @param $dir
	 * @return bool
	 */
	public static function rmDir($dir): bool {
		if (!str_starts_with($dir, ROOT_PATH . '/tmp/')) {
			return false;
		}
		if ($directory = @dir($dir)) {
			while ($entry = $directory->read()) {
				if ($entry == '.' || $entry == '..') {
					continue;
				}
				$filename = $dir . '/' . $entry;
				if (is_file($filename)) {
					@unlink($filename);
				} else {
					self::rmDir($filename);
				}
			}
			$directory->close();
			@rmdir($dir);
		}
		return true;
	}

	/**
	 * 复制文件夹
	 * @param $from
	 * @param $to
	 * @return bool
	 */
	public static function copyDir($from, $to): bool {
		if (is_file($to)) {
			return false;
		}
		if (!file_exists($to)) {
			self::mkDir($to);
		}

		if ($dir_handle = @opendir($from)) {
			while ($filename = readdir($dir_handle)) {
				if ($filename != "." && $filename != "..") {
					$subSrcFile = $from . "/" . $filename;
					$subToFile = $to . "/" . $filename;

					if (is_dir($subSrcFile)) {
						if (!self::copyDir($subSrcFile, $subToFile)) {
							return false;
						}
					}

					if (is_file($subSrcFile)) {
						copy($subSrcFile, $subToFile);
					}
				}
			}
			closedir($dir_handle);
		}
		return true;
	}

}